package ThreadPool_Test;
import javax.security.auth.callback.CallbackHandler;
import java.util.concurrent.*;

public class test {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //可以使用Executors工具类的静态方法创建线程池
        /*
        #############################################################
        FixedThreadPool：固定线程数量的线程池。该线程池中的线程数量始终不变。当有一个新的任务提交时，
        线程池中若有空闲线程，则立即执行。若没有，则新的任务会被暂存在一个任务队列中，待有线程空闲时，便处理在任务队列中的任务。
        #############################################################
        SingleThreadExecutor： 只有一个线程的线程池。若多余一个任务被提交到该线程池，任务会被保存在一个任务队列中，待线程空闲，按先入先出的顺序执行队列中的任务。
        #############################################################
        CachedThreadPool： 可根据实际情况调整线程数量的线程池。线程池的线程数量不确定，但若有空闲线程可以复用，则会优先使用可复用的线程。
        若所有线程均在工作，又有新的任务提交，则会创建新的线程处理任务。所有线程在当前任务执行完毕后，将返回线程池进行复用。
        #############################################################
        ScheduledThreadPool：给定的延迟后运行任务或者定期执行任务的线程池。
        #############################################################
         */
        ExecutorService threadpool = Executors.newFixedThreadPool(5);
        Callable<Integer> callbackhandler = new Callable() {
            @Override
            public Integer call() throws Exception {
                int sum = 0;
                for (int i = 0; i < 10; i++) {
                    sum += i;
                }
                return sum;
            }
        };
        Future future = threadpool.submit(callbackhandler);
        System.out.println(future.get());
        threadpool.shutdown();

    }
}
